package com.employment.dao;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.employment.entity.ChatMessage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 聊天消息Mapper接口
 * 
 * @author Employment System
 * @since 1.0.0
 */
@Mapper
public interface ChatMessageMapper extends BaseMapper<ChatMessage> {

    /**
     * 分页查询会话消息列表
     *
     * @param page           分页参数
     * @param conversationId 会话ID
     * @return 消息分页列表
     */
    Page<ChatMessage> selectConversationMessagePage(Page<ChatMessage> page,
                                                    @Param("conversationId") Long conversationId);

    /**
     * 查询会话的最新消息
     *
     * @param conversationId 会话ID
     * @param limit          限制数量
     * @return 消息列表
     */
    List<ChatMessage> selectLatestMessages(@Param("conversationId") Long conversationId,
                                         @Param("limit") Integer limit);

    /**
     * 查询用户在会话中的未读消息数量
     *
     * @param conversationId     会话ID
     * @param userId             用户ID
     * @param lastReadMessageId  最后阅读消息ID
     * @return 未读消息数量
     */
    Integer countUnreadMessages(@Param("conversationId") Long conversationId,
                               @Param("userId") Long userId,
                               @Param("lastReadMessageId") Long lastReadMessageId);

    /**
     * 标记消息为已读
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @param messageId      消息ID
     * @return 更新结果
     */
    int markAsRead(@Param("conversationId") Long conversationId,
                   @Param("userId") Long userId,
                   @Param("messageId") Long messageId);

    /**
     * 批量标记消息为已读
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @param messageIds     消息ID列表
     * @return 更新结果
     */
    int batchMarkAsRead(@Param("conversationId") Long conversationId,
                       @Param("userId") Long userId,
                       @Param("messageIds") List<Long> messageIds);

    /**
     * 撤回消息
     *
     * @param messageId 消息ID
     * @param userId    撤回用户ID
     * @return 更新结果
     */
    int recallMessage(@Param("messageId") Long messageId,
                     @Param("userId") Long userId);

    /**
     * 删除会话中的所有消息
     *
     * @param conversationId 会话ID
     * @return 删除结果
     */
    int deleteByConversationId(@Param("conversationId") Long conversationId);

    /**
     * 查询消息发送统计
     *
     * @param userId 用户ID
     * @param days   天数
     * @return 统计数据
     */
    List<String> selectMessageStats(@Param("userId") Long userId,
                                   @Param("days") Integer days);

    /**
     * 搜索消息内容
     *
     * @param conversationId 会话ID
     * @param keyword        关键词
     * @param limit          限制数量
     * @return 消息列表
     */
    List<ChatMessage> searchMessages(@Param("conversationId") Long conversationId,
                                    @Param("keyword") String keyword,
                                    @Param("limit") Integer limit);
}